#include <stdio.h>
#include <stdlib.h>
#include "boolean.h"
#define MARK '@end'

/*** Kamus Mesin Kar ***/
//extern char CC;		//for header
//extern boolean EOP;	//for header
char CC;
boolean EOP;
static FILE *pita;
static char FILE_NAME[63];
static int retval;
/*** Kamus Mesin Kata ***/
#define NMax 100
#define BLANK ' '
typedef struct {
    char TabKata[NMax];
    int Length;
    } Kata;
//extern boolean EndKata; 	//for header
//extern Kata CKata;		//for header
boolean EndKata;
Kata CKata;
/*** Kamus Modified ***/
//typedef char *line;

/*** Penanganan I/O ***/
void FILE () {
/* Prosedure untuk membaca nama file input 
I.S : sembarang
F.S : FILE_NAME terdefinisi */
	printf("Input nama file");
	scanf("%s",FILE_NAME);
}

/*** Mesin Kar ***/
void START() {
/* Mesin siap dioperasikan. Pita disiapkan untuk dibaca. Karakter pertama yang ada pada
pita posisinya adalah pada jendela.
I.S. : sembarang
F.S. : CC adalah karakter pertama pada pita. Jika CC != MARK maka EOP akan padam (false). Jika CC =
MARK maka EOP akan menyala (true) */
/* Algoritma */
    pita = fopen(FILE_NAME,"r");
    ADV();
}
void ADV() {
/* Pita dimajukan satu karakter.
I.S. : Karakter pada jendela = CC, CC != MARK
F.S. : CC adalah karakter berikutnya dari CC yang lama,
CC mungkin = MARK
Jika  CC = MARK maka EOP akan menyala (true) */
/* Algoritma */
    retval = fscanf(pita,"%c",&CC);
    if (CC == MARK){EOP=true;}
    else {EOP=false;}
    if (EOP) {
        fclose(pita);
    }
}

/*** Mesin Kata ***/
void IgnoreBlank(){
/* Mengabaikan satu atau beberapa BLANK
I.S. : CC sembarang
F.S. : CC != BLANK atau CC = MARK */
/* Kamus Lokal */
/* Algoritma */
    while ((CC == BLANK) && (CC != MARK)) {
        ADV();
    } /* CC != BLANK or CC = MARK */
}
void STARTKATA(){
/* I.S. : CC sembarang
F.S. : EndKata = true, dan CC = Mark;
atau EndKata = false, CKata adalah kata yang sudah
diakuisisi,
CC karakter pertama sesudah karakter terakhir kata */
/* Kamus Lokal */
/* Algoritma*/
    START();
    IgnoreBlank();
    if (CC == MARK) {
        EndKata = true;
    } else /* CC != MARK */ {
        EndKata = false;
        SalinKata();
        }
}
void ADVKATA(){
/* I.S. : CC adalah karakter pertama kata yang akan diakuisisi
F.S. : CKata adalah kata terakhir yang sudah diakuisisi,
CC adalah karakter pertama dari kata berikutnya,
mungkin MARK
Proses : Akuisisi kata menggunakan procedure SalinKata */
/* Kamus Lokal */
/* Algoritma*/
    IgnoreBlank();
    if (CC == MARK) {
        EndKata = true;
    } else /* CC != MARK */ {
        SalinKata();
        }
}
void SalinKata()
/* Mengakuisisi kata, menyimpan dalam CKata
I.S. : CC adalah karakter pertama dari kata
F.S. : CKata berisi kata yang sudah diakuisisi;
CC = BLANK atau CC = MARK;
CC adalah karakter sesudah karakter terakhir yang
diakuisisi */
{  /* Kamus Lokal */
int i; //= 1; /* inisialisasi */
/* Algoritma*/
    for (i=0;i<=NMax;i++) {
        //if (i<=50) {
            CKata.TabKata[i] = CC; //}
        ADV();
        if ((CC == MARK) || (CC == BLANK)) {
            break;
        } //else {
            //i++;
        //}
    } /* CC = MARK or CC = BLANK */
    CKata.Length = i;
    //CKata.TabKata[0]=' ';
}

/*** Modified Modul ***/
void ReadFile (line x){
/**/
	free(x);	//not needed?
	x=(char*) malloc (sizeof(char));
	fscanf(FILE_NAME,"%s",x);
}
//void 